#include <iostream>
#include <unistd.h>
#include <signal.h>



using namespace std;

void handler(int signo)
{
    cout << "catch a signo" << endl;
}
int main()
{
    signal(2,handler);
    //对2号信号 屏蔽
    sigset_t b_sit, o_sit;//定义位图结构
    sigemptyset(&b_sit);//初始化为0
    sigemptyset(&o_sit);//初始化为0

    sigaddset(&b_sit,2);//屏蔽2号信号，此时并未真正屏蔽，仍在用户区，

    //所以才需要使用sigprocmask系统调用接口将屏蔽号存放在内核PCB上。
    sigprocmask(SIG_SETMASK,&b_sit,&o_sit);//旧位图会返回。
    //SIG_SETMASK:将b_sit上设置的位图一个一个应用在内核中


    //重复打印pending位图（开始应该全0）

    sigset_t pending;
    int i = 0;
    while(true)
    {
        int n = sigpending(&pending);
        for(int i = 1; i <= 31; i++)
        {
            if(sigismember(&pending,i)) cout << " 1 ";
            else cout<<" 0 ";
        }
        cout << endl;
        sleep(1);
        i++;
        if(i == 10)//10s后解除屏蔽
        {
            sigprocmask(SIG_SETMASK,&o_sit,nullptr);
        }

    }

    return 0;
}